(function ($) {
    $.extend({
        _tree: {},
        btTable: {},
        // 表格封装处理
        table: {
            _option: {},
            // 初始化表格参数
            init: function (options) {
                var defaults = {
                    id: "bootstrap-table",
                    type: 0, // 0 代表bootstrapTable 1代表bootstrapTreeTable
                    height: undefined,
                    sidePagination: "server",
                    sortName: "",
                    sortOrder: "asc",
                    pagination: true,
                    pageSize: 10,
                    pageList: [10, 25, 50],
                    toolbar: "toolbar",
                    striped: false,
                    escape: false,
                    firstLoad: true,
                    showFooter: false,
                    search: false,
                    clickToSelect: true,
                    rememberSelected: false,
                    queryParams: $.table.queryParams,
                    rowStyle: {},
                    uniqueId: 'id',
                    treeShowField: null,
                    idField: 'id',
                    parentIdField: 'pid'
                };
                var options = $.extend(defaults, options);
                $.table._option = options;
                $.btTable = $('#' + options.id);
                $('#' + options.id).bootstrapTable({
                    url: options.url,                                   // 请求后台的URL（*）
                    contentType: "application/x-www-form-urlencoded",   // 编码类型
                    method: 'post',                                     // 请求方式（*）
                    cache: false,                                       // 是否使用缓存
                    height: options.height,                             // 表格的高度
                    striped: options.striped,                           // 是否显示行间隔色
                    sortable: true,                                     // 是否启用排序
                    sortStable: true,                                   // 设置为 true 将获得稳定的排序
                    sortName: options.sortName,                         // 排序列名称
                    sortOrder: options.sortOrder,                       // 排序方式  asc 或者 desc
                    pagination: options.pagination,                     // 是否显示分页（*）
                    pageNumber: 1,                                      // 初始化加载第一页，默认第一页
                    pageSize: options.pageSize,                         // 每页的记录行数（*）
                    pageList: options.pageList,                         // 可供选择的每页的行数（*）
                    firstLoad: options.firstLoad,                       // 是否首次请求加载数据，对于数据较大可以配置false
                    escape: options.escape,                             // 转义HTML字符串
                    showFooter: options.showFooter,                     // 是否显示表尾
                    iconSize: 'sm',                                // 图标大小：undefined默认的按钮尺寸 xs超小按钮sm小按钮lg大按钮
                    classes: 'table table-no-bordered',
                    toolbar: '#' + options.toolbar,                     // 指定工作栏
                    sidePagination: options.sidePagination,             // server启用服务端分页client客户端分页
                    search: options.search,                             // 是否显示搜索框功能
                    uniqueId: options.uniqueId,                         // 唯 一的标识符
                    clickToSelect: options.clickToSelect,				// 是否启用点击选中行
                    detailView: options.detailView,                     // 是否启用显示细节视图
                    rememberSelected: true,         // 启用翻页记住前面的选择
                    queryParams: options.queryParams,                   // 传递参数（*）
                    // rowStyle: options.rowStyle,                         // 通过自定义函数设置行样式
                    columns: options.columns,                           // 显示列信息（*）
                    responseHandler: $.table.responseHandler,           // 在加载服务器发送来的数据之前处理函数
                    onLoadSuccess: $.table.onLoadSuccess,               // 当所有数据被加载时触发处理函数
                    onPostBody: $.table.onPostBody,
                    exportOptions: options.exportOptions,               // 前端导出忽略列索引
                    detailFormatter: options.detailFormatter,           // 在行下面展示其他数据列表
                    treeShowField: options.treeShowField,
                    idField: options.idField,
                    parentIdField: options.parentIdField
                });
            },
            // 查询条件
            queryParams: function (params) {
                var curParams = {
                    // 传递参数查询参数
                    pageSize: params.limit,
                    pageNum: params.offset / params.limit + 1,
                    searchValue: params.search,
                    orderByColumn: params.sort,
                    isAsc: params.order
                };
                var currentId = $.common.isEmpty($.table._option.formId) ? $('form').attr('id') : $.table._option.formId;
                return $.extend(curParams, $.common.formToJSON(currentId));
            },
            // 请求获取数据后处理回调函数
            responseHandler: function (res) {
                if (typeof $.table._option.responseHandler == "function") {
                    return $.table._option.responseHandler(res);
                } else {
                    return res;
                }
            },
            // 当所有数据被加载时触发
            onLoadSuccess: function (data) {
                if (typeof $.table._option.onLoadSuccess == "function") {
                    $.table._option.onLoadSuccess(data);
                }
            },
            onPostBody: function (data) {
                if (typeof $.table._option.onPostBody == "function") {
                    $.table._option.onPostBody(data);
                }
            },
            // 表格销毁
            destroy: function (tableId) {
                var currentId = $.common.isEmpty(tableId) ? $.table._option.id : tableId;
                $("#" + currentId).bootstrapTable('destroy');
            },
            // 序列号生成
            serialNumber: function (index) {
                var params = $.btTable.bootstrapTable('getOptions');
                var pageSize = params.pageSize;
                var pageNumber = params.pageNumber;
                return pageSize * (pageNumber - 1) + index + 1;
            },
            search: function (formId, data) {
                var params = $.btTable.bootstrapTable('getOptions');
                params.queryParams = function (params) {
                    var search = $.common.formToJSON(formId);
                    if ($.common.isNotEmpty(data)) {
                        $.each(data, function (key) {
                            search[key] = data[key];
                        });
                    }
                    search.pageSize = params.limit;
                    search.pageNum = params.offset / params.limit + 1;
                    search.searchValue = params.search;
                    search.orderByColumn = params.sort;
                    search.isAsc = params.order;
                    return search;
                };
                $.btTable.bootstrapTable('refresh', params);
            },
            // 刷新表格
            refresh: function () {
                $.btTable.bootstrapTable('refresh', {
                    silent: true
                });
            },
            // 查询表格指定列值
            selectColumns: function (column) {
                var rows = $.map($.btTable.bootstrapTable('getSelections'), function (row) {
                    return row[column];
                });
                // if ($.common.isNotEmpty($.table._option.rememberSelected) && $.table._option.rememberSelected) {
                //     rows = rows.concat(selectionIds);
                // }
                return rows;
            },
            // 获取当前页选中或者取消的行ID
            affectedRowIds: function (rows) {
                var column = $.common.isEmpty($.table._option.uniqueId) ? $.table._option.columns[1].field : $.table._option.uniqueId;
                var rowIds;
                if ($.isArray(rows)) {
                    rowIds = $.map(rows, function (row) {
                        return row[column];
                    });
                } else {
                    rowIds = [rows[column]];
                }
                return rowIds;
            },
            // 查询表格首列值
            selectFirstColumns: function () {
                var rows = $.map($.btTable.bootstrapTable('getSelections'), function (row) {
                    return row[$.table._option.columns[1].field];
                });
                if ($.common.isNotEmpty($.table._option.rememberSelected) && $.table._option.rememberSelected) {
                    rows = rows.concat(selectionIds);
                }
                return $.common.uniqueFn(rows);
            },
            // 回显数据字典
            selectDictLabel: function (datas, value) {
                var actions = [];
                $.each(datas, function (index, dict) {
                    if (dict.dictValue == ('' + value)) {
                        var listClass = $.common.equals("default", dict.listClass) || $.common.isEmpty(dict.listClass) ? "" : "badge badge-" + dict.listClass;
                        actions.push($.common.sprintf("<span class='%s'>%s</span>", listClass, dict.dictLabel));
                        return false;
                    }
                });
                return actions.join('');
            },
            // 显示表格指定列
            showColumn: function (column) {
                $.btTable.bootstrapTable('showColumn', column);
            },
            // 隐藏表格指定列
            hideColumn: function (column) {
                $.btTable.bootstrapTable('hideColumn', column);
            }
        },


        modal: {
            open: function (title, url, width, height, callback) {
                //如果是移动端，就使用自适应大小弹窗
                if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) {
                    width = 'auto';
                    height = 'auto';
                }
                if ($.common.isEmpty(title)) {
                    title = false;
                }
                if ($.common.isEmpty(url)) {
                    url = "/404.html";
                }
                if ($.common.isEmpty(width)) {
                    width = 300;
                }
                if ($.common.isEmpty(height)) {
                    height = 400;
                }
                if ($.common.isEmpty(callback)) {
                    callback = function (index, layero) {
                        var iframeWin = layero.find('iframe')[0];
                        iframeWin.contentWindow.submitHandler(index, layero);
                    }
                }
                layer.open({
                    type: 2,
                    area: [width + 'px', height + 'px'],
                    fix: false,
                    //不固定
                    maxmin: false,
                    shade: 0.3,
                    title: title,
                    content: url,
                    btn: ['确定', '关闭'],
                    // 弹层外区域关闭
                    shadeClose: true,
                    yes: callback,
                    cancel: function (index) {
                        return true;
                    }
                });
            },
            // 消息提示
            msg: function (content, type) {
                if (type != undefined) {
                    layer.msg(content, {icon: type, time: 1000, shift: 5});
                } else {
                    layer.msg(content);
                }
            },
            // 错误消息
            msgError: function (content) {
                $.modal.msg(content, 2);
            },
            // 成功消息
            msgSuccess: function (content) {
                $.modal.msg(content, 1);
            },
            // 警告消息
            msgWarning: function (content) {
                $.modal.msg(content, 0);
            },
            // 错误提示
            alertError: function (content) {
                $.modal.alert(content, 2);
            },
            // 成功提示
            alertSuccess: function (content) {
                $.modal.alert(content, 1);
            },
            // 警告提示
            alertWarning: function (content) {
                $.modal.alert(content, 0);
            },
            // 弹出提示
            alert: function (content, type) {
                layer.alert(content, {
                    icon: type,
                    title: "系统提示",
                    btn: ['确认'],
                    btnclass: ['btn btn-primary'],
                });
            },
            // 关闭窗体
            close: function () {
                var index = parent.layer.getFrameIndex(window.name);
                parent.layer.close(index);
            },
            // 关闭全部窗体
            closeAll: function () {
                layer.closeAll();
            },
            // 确认窗体
            confirm: function (content, callBack) {
                layer.confirm(content, {
                    icon: 3,
                    title: "系统提示",
                    btn: ['确认', '取消']
                }, function (index) {
                    layer.close(index);
                    callBack(true);
                });
            },
        },
        // 操作封装处理
        operate: {
            // 提交数据
            submit: function (url, type, dataType, data, callback) {
                var config = {
                    url: url,
                    type: type,
                    dataType: dataType,
                    data: data,
                    success: function (result) {
                        if (typeof callback == "function") {
                            callback(result);
                        }
                        $.table.refresh();
                    }
                };
                $.ajax(config)
            },
            // 保存信息 刷新表格
            save: function (url, data) {
                $.operate.submit(url, "post", "json", data, function (result) {
                    if (result.code === 0) {
                        var parent = window.parent;
                        // parent.$.modal.msgSuccess(result.msg);
                        parent.$.table.refresh();
                        $.modal.close();
                    } else if (result.code === 500) {
                        $.modal.alertWarning(result.msg)
                    } else {
                        $.modal.alertError(result.msg);
                    }
                });
            },
            // 删除信息
            remove: function () {
                var rows = $.table.selectColumns($.table._option.uniqueId);
                if (rows.length === 0) {
                    $.modal.alertWarning("请至少选择一条记录");
                    return;
                }
                $.modal.confirm("确认要删除选中的" + rows.length + "条数据吗?", function () {
                    var url = $.table._option.removeUrl;
                    var data = {"ids": rows.join()};
                    $.operate.submit(url, "post", "json", data, function (resp) {
                        $.table.refresh();
                    });
                });
            },
            // 添加信息
            add: function () {
                var width = $.table._option.modalWidth;
                var height = $.table._option.modalHeight;
                $.modal.open("添加" + $.table._option.modalName, $.table._option.createUrl, width, height);
            },

            addPage: function () {
                window.location.href = $.table._option.createUrl;
            },
            // 修改信息
            edit: function () {
                var width = $.table._option.modalWidth;
                var height = $.table._option.modalHeight;
                var id = $.table.selectColumns($.table._option.uniqueId);
                if (id.length === 0) {
                    $.modal.alertWarning("请至少选择一条记录");
                    return;
                }
                var url = $.table._option.updateUrl.replace("{id}", id[0]);
                $.modal.open("修改" + $.table._option.modalName, url, width, height);
            },

            editPage: function () {
                var id = $.table.selectColumns($.table._option.uniqueId);
                if (id.length === 0) {
                    $.modal.alertWarning("请至少选择一条记录");
                    return;
                }
                var url = $.table._option.updateUrl.replace("{id}", id[0]);
                window.location.href = url;
            },

            openUrl: function (name, url, height, width) {
                if (!height) {
                    height = $.table._option.modalHeight;
                }
                if (!width) {
                    width = $.table._option.modalWidth;
                }
                var id = $.table.selectColumns($.table._option.uniqueId);
                if (id.length == 0) {
                    $.modal.alertWarning("请至少选择一条记录");
                    return;
                }
                var url = url.replace("{id}", id[0]);
                $.modal.open(name, url, width, height);
            }
        },
        // 校验封装处理
        validate: {
            // 判断返回标识是否唯一 false 不存在 true 存在
            unique: function (resp) {
                var json = JSON.parse(resp);
                if (json.data == 0) {
                    return true;
                }
                return false;
            },
            // 表单验证
            form: function (formId) {
                var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId;
                return $("#" + currentId).validate().form();
            }
        },

        tree: {
            _tree: {},
            _option: {},
            // 初始化树结构
            init: function (options, success) {
                var defaults = {
                    id: "tree",
                    url: '',
                    plugins: ["checkbox", "types"],
                    types: {},
                    themes: {"theme": "classic", "dots": true, "icons": true},
                    tid: 'id',
                    tPid: 'pid',
                    tName: 'name'
                };
                var options = $.extend(defaults, options);
                $.tree._option = options;
                $._tree = $("#" + options.id).jstree({
                    core: {
                        animation: 0,
                        themes: options.themes,
                        check_callback: true,
                        data: function (obj, callback) {
                            var data = [];
                            $.ajax({
                                type: "POST",
                                url: options.url,
                                dataType: "json",
                                async: false,
                                success: function (result) {
                                    console.log(result);
                                    var arrays = result.data;
                                    for (var i = 0; i < arrays.length; i++) {
                                        var arr = {
                                            "id": arrays[i][options.tid],
                                            "parent": arrays[i][options.tPid] ? arrays[i][options.tPid] : "#",
                                            "text": arrays[i][options.tName]
                                        };
                                        data.push(arr);
                                    }
                                }
                            });
                            callback.call(this, data);
                            success && success();
                        }
                    },
                    types: options.types,
                    checkbox: {},
                    plugins: options.plugins
                });

                // $.get(options.url, function(data) {
                //     var treeId = $("#treeId").val();
                //     tree = $.fn.zTree.init($("#" + options.id), setting, data);
                //     $._tree = tree;
                //     var nodes = tree.getNodesByParam("level", options.expandLevel - 1);
                //     for (var i = 0; i < nodes.length; i++) {
                //         tree.expandNode(nodes[i], true, false, false);
                //     }
                //     var node = tree.getNodesByParam("id", treeId, null)[0];
                //     $.tree.selectByIdName(treeId, node);
                // });
            },
            // 搜索节点
            searchNode: function () {
                var value = $.common.trim($("#keyword").val());
            },
            initTree: function () {
                $._tree.jstree('deselect_all');
                $._tree.jstree().close_all();
            },
            // 根据Id和Name选中指定节点
            selectNode: function (val) {
                $._tree.jstree(true).select_node(val.split(','));
            },
            getChecked: function () {
                return $._tree.jstree("get_checked").join();
            },
            // 显示所有节点
            showAllNode: function (nodes) {
                nodes = $._tree.transformToArray(nodes);
                for (var i = nodes.length - 1; i >= 0; i--) {
                    if (nodes[i].getParentNode() != null) {
                        $._tree.expandNode(nodes[i], true, false, false, false);
                    } else {
                        $._tree.expandNode(nodes[i], true, true, false, false);
                    }
                    $._tree.showNode(nodes[i]);
                    $.tree.showAllNode(nodes[i].children);
                }
            },
            // 隐藏所有节点
            hideAllNode: function (nodes) {
                var tree = $.fn.zTree.getZTreeObj("tree");
                var nodes = $._tree.transformToArray(nodes);
                for (var i = nodes.length - 1; i >= 0; i--) {
                    $._tree.hideNode(nodes[i]);
                }
            },
            // 显示所有父节点
            showParent: function (treeNode) {
                var parentNode;
                while ((parentNode = treeNode.getParentNode()) != null) {
                    $._tree.showNode(parentNode);
                    $._tree.expandNode(parentNode, true, false, false);
                    treeNode = parentNode;
                }
            },
            // 显示所有孩子节点
            showChildren: function (treeNode) {
                if (treeNode.isParent) {
                    for (var idx in treeNode.children) {
                        var node = treeNode.children[idx];
                        $._tree.showNode(node);
                        $.tree.showChildren(node);
                    }
                }
            },
            // 更新节点状态
            updateNodes: function (nodeList) {
                $._tree.showNodes(nodeList);
                for (var i = 0, l = nodeList.length; i < l; i++) {
                    var treeNode = nodeList[i];
                    $.tree.showChildren(treeNode);
                    $.tree.showParent(treeNode)
                }
            },
            // 获取当前被勾选集合
            getCheckedNodes: function (column) {
                var _column = $.common.isEmpty(column) ? "id" : column;
                var nodes = $._tree.getCheckedNodes(true);
                return $.map(nodes, function (row) {
                    return row[_column];
                }).join();
            },
            // 不允许根父节点选择
            notAllowParents: function (_tree) {
                var nodes = _tree.getSelectedNodes();
                for (var i = 0; i < nodes.length; i++) {
                    if (nodes[i].level == 0) {
                        $.modal.msgError("不能选择根节点（" + nodes[i].name + "）");
                        return false;
                    }
                    if (nodes[i].isParent) {
                        $.modal.msgError("不能选择父节点（" + nodes[i].name + "）");
                        return false;
                    }
                }
                return true;
            },
            // 不允许最后层级节点选择
            notAllowLastLevel: function (_tree) {
                var nodes = _tree.getSelectedNodes();
                for (var i = 0; i < nodes.length; i++) {
                    if (!nodes[i].isParent) {
                        $.modal.msgError("不能选择最后层级节点（" + nodes[i].name + "）");
                        return false;
                    }
                }
                return true;
            },
            // 隐藏/显示搜索栏
            toggleSearch: function () {
                $('#search').slideToggle(200);
                $('#btnShow').toggle();
                $('#btnHide').toggle();
                $('#keyword').focus();
            },
            // 折叠
            collapse: function () {
                $._tree.expandAll(false);
            },
            // 展开
            expand: function () {
                $._tree.expandAll(true);
            }
        },
        // 通用方法封装处理
        common: {
            // 判断字符串是否为空
            isEmpty: function (value) {
                if (value == null || this.trim(value) == "") {
                    return true;
                }
                return false;
            },
            // 判断一个字符串是否为非空串
            isNotEmpty: function (value) {
                return !$.common.isEmpty(value);
            },
            // 空对象转字符串
            nullToStr: function (value) {
                if ($.common.isEmpty(value)) {
                    return "-";
                }
                return value;
            },
            // 是否显示数据 为空默认为显示
            visible: function (value) {
                if ($.common.isEmpty(value) || value == true) {
                    return true;
                }
                return false;
            },
            // 空格截取
            trim: function (value) {
                if (value == null) {
                    return "";
                }
                return value.toString().replace(/(^\s*)|(\s*$)|\r|\n/g, "");
            },
            // 比较两个字符串（大小写敏感）
            equals: function (str, that) {
                return str == that;
            },
            // 比较两个字符串（大小写不敏感）
            equalsIgnoreCase: function (str, that) {
                return String(str).toUpperCase() === String(that).toUpperCase();
            },
            // 将字符串按指定字符分割
            split: function (str, sep, maxLen) {
                if ($.common.isEmpty(str)) {
                    return null;
                }
                var value = String(str).split(sep);
                return maxLen ? value.slice(0, maxLen - 1) : value;
            },
            // 字符串格式化(%s )
            sprintf: function (str) {
                var args = arguments, flag = true, i = 1;
                str = str.replace(/%s/g, function () {
                    var arg = args[i++];
                    if (typeof arg === 'undefined') {
                        flag = false;
                        return '';
                    }
                    return arg;
                });
                return flag ? str : '';
            },
            // 指定随机数返回
            random: function (min, max) {
                return Math.floor((Math.random() * max) + min);
            },
            // 判断字符串是否是以start开头
            startWith: function (value, start) {
                var reg = new RegExp("^" + start);
                return reg.test(value)
            },
            // 判断字符串是否是以end结尾
            endWith: function (value, end) {
                var reg = new RegExp(end + "$");
                return reg.test(value)
            },
            // 数组去重
            uniqueFn: function (array) {
                var result = [];
                var hashObj = {};
                for (var i = 0; i < array.length; i++) {
                    if (!hashObj[array[i]]) {
                        hashObj[array[i]] = true;
                        result.push(array[i]);
                    }
                }
                return result;
            },
            // 数组中的所有元素放入一个字符串
            join: function (array, separator) {
                if ($.common.isEmpty(array)) {
                    return null;
                }
                return array.join(separator);
            },
            // 获取form下所有的字段并转换为json对象
            formToJSON: function (formId) {
                var json = {};
                $.each($("#" + formId).serializeArray(), function (i, field) {
                    json[field.name] = field.value;
                });
                return json;
            },
            formEdit: function (data) {
                return this.each(function () {
                    var input, name;
                    if (data == null) {
                        this.reset();
                        return;
                    }
                    for (var i = 0; i < this.length; i++) {
                        input = this.elements[i];
                        //checkbox的name可能是name[]数组形式
                        name = (input.type == "checkbox") ? input.name.replace(/(.+)\[\]$/, "$1") : input.name;
                        if (data[name] == undefined) continue;
                        switch (input.type) {
                            case "checkbox":
                                if (data[name] == "") {
                                    input.checked = false;
                                } else {
                                    //数组查找元素
                                    if (data[name].indexOf(input.value) > -1) {
                                        input.checked = true;
                                    } else {
                                        input.checked = false;
                                    }
                                }
                                break;
                            case "radio":
                                if (data[name] == "") {
                                    input.checked = false;
                                } else if (input.value == data[name]) {
                                    input.checked = true;
                                }
                                break;
                            case "button":
                                break;
                            default:
                                input.value = data[name];
                        }
                    }
                });
            }
        }
    });
})(jQuery);

$(function () {
    for (var i = window.location,
             n = $(".sidebar-menu a").filter(function () {
                 return String(i.href).indexOf(this.href) > -1;
             }).parent().addClass("active"); ;) {
        if (!n.is("li")) break;
        n = n.parents('.treeview').addClass("menu-open").addClass("active")
    }

    $.datetimepicker.setLocale('zh');
    $('.datetimepicker').datetimepicker({
        step: 30
    });
});




